package com.chen.blue.utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import lombok.extern.slf4j.Slf4j;

/**
 * Created By CLT On 2023/10/25.
 */
@SuppressWarnings("all")
@Slf4j
public class GeneratorUtil {

    public static void main(String[] args) {
        try {
            GeneratorUtil.getGenerator("school_flowable", "root", "7536951", "service_contest_result_history", "service_");
        } catch (Exception e) {
            log.error("不用管报错");
        }
    }


    /**
     * 代码生成
     *
     * @param databaseName 数据库名称
     * @param username
     * @param password
     * @param tableName    生成的表名
     * @param tablePrefix  表前缀
     * @return 是否生成成功
     */
    public static void getGenerator(String databaseName,
                                    String username,
                                    String password,
                                    String tableName,
                                    String tablePrefix) {
        /**
         * 全局配置
         */
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig
                .setActiveRecord(true)
                // 作者
                .setAuthor("CLT")
                // 生成路径，最好使用绝对路径
                .setOutputDir("H:\\generor")
                // 文件覆盖
                .setFileOverride(true)
                // 主键策略
                .setIdType(IdType.AUTO)

                .setDateType(DateType.ONLY_DATE)
                // 设置生成的service接口的名字的首字母是否为I，默认Service是以I开头的
                .setServiceName("I%sService")
                .setServiceImplName("I%sServiceImpl")

                //实体类结尾名称
                .setEntityName("%sModel")

                //生成基本的resultMap
                .setBaseResultMap(true)

                //不使用AR模式
                .setActiveRecord(false)

                //生成基本的SQL片段
                .setBaseColumnList(true);

        /**
         * 数据源配置
         */
        DataSourceConfig dsConfig = new DataSourceConfig();
        // 设置数据库类型
        dsConfig.setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUrl(String.format("jdbc:mysql://localhost:3306/%s?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai", databaseName))
                .setUsername(username)
                .setPassword(password);
        /**
         * 策略配置globalConfiguration中
         */
        StrategyConfig stConfig = new StrategyConfig();
        //全局大写命名
        stConfig.setCapitalMode(true)
                // 数据库表映射到实体的命名策略
                .setNaming(NamingStrategy.underline_to_camel)

                //使用lombok
                .setEntityLombokModel(true)

                //使用restcontroller注解
                .setRestControllerStyle(true)

                // 生成的表, 支持多表一起生成，以数组形式填写
                .setInclude(tableName)
                .setTablePrefix(tablePrefix);
        //.setInclude(scanner("表名，多个英文逗号分割").split(","));

        /**
         * 包名策略配置
         */
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("com.chen.blue")
                .setMapper("mapper.business")
                .setService("service.business")
                .setController("controller.admin.business")
                .setEntity("domain.model.business")
                .setXml("resource.mapper.business")
                .setServiceImpl("service.business.impl");

        /**
         * 整合配置
         */
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(globalConfig)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);

        /**
         * 生成代码
         */
        try {
            ag.execute();
        } catch (Exception e) {
            log.error("代码生成失败");
        } finally {
            log.error("代码生成成功");
        }

    }

}
